Lazy Loading এবং Eager Loading হল দুটি গুরুত্বপূর্ণ কনসেপ্ট যা NHibernate এর ডেটা লোডিং কৌশল হিসেবে ব্যবহৃত হয়। এগুলি মূলত এই প্রশ্নের উত্তর দেয়, "ডেটাবেস থেকে সম্পর্কিত ডেটা কখন এবং কীভাবে লোড হবে?"
- Lazy Loading এর মাধ্যমে সম্পর্কিত ডেটা তখনই লোড হয় যখন তা প্রথমবার অ্যাক্সেস করা হয়। এটি ডেটা লোডিং পারফরম্যান্স উন্নত করতে সহায়তা করে, কারণ শুধুমাত্র প্রয়োজনীয় ডেটাই লোড করা হয়।
- Eager Loading এর মাধ্যমে সম্পর্কিত ডেটা একটি কোয়েরি চলানোর সময় একসাথে লোড হয়, যাতে পরে ডেটা অ্যাক্সেস করার প্রয়োজন না পড়ে।
1. Lazy Loading
Lazy Loading হল একটি কৌশল যেখানে সম্পর্কিত ডেটা তখনই লোড হয় যখন তা অ্যাক্সেস করা হয়। এটি পারফরম্যান্স অপটিমাইজ করতে সহায়তা করে, কারণ শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা হয়, এবং ডেটাবেসের সঙ্গে কম বার যোগাযোগ করা হয়।
NHibernate এ Lazy Loading ডিফল্টভাবে সক্রিয় থাকে, অর্থাৎ সম্পর্কিত অবজেক্টগুলো তখনই লোড হবে যখন সেগুলি অ্যাক্সেস করা হবে।
Lazy Loading কনফিগারেশন
Lazy Loading কনফিগার করতে আপনার mapping ফাইলে lazy="true" প্যারামিটার ব্যবহার করতে হবে।
<bag name="Orders" table="Orders" lazy="true">
<key column="CustomerId"/>
<one-to-many class="Order"/>
</bag>
এখানে lazy="true" ব্যবহার করা হলে, Orders সম্পর্কিত ডেটা শুধুমাত্র যখন অ্যাক্সেস করা হবে তখনই লোড হবে।
Lazy Loading উদাহরণ
ধরা যাক আপনার একটি Customer এবং Order ক্লাস আছে, যেখানে Customer এর মধ্যে একাধিক Order থাকতে পারে:
public class Customer
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
// Lazy Loading enabled for Orders
public virtual IList<Order> Orders { get; set; }
}
public class Order
{
public virtual int Id { get; set; }
public virtual string Product { get; set; }
}
এখানে, Orders এর জন্য Lazy Loading ব্যবহার করা হয়েছে, যার মানে হচ্ছে যখন আপনি Customer অবজেক্ট লোড করবেন, তখন Orders এর ডেটা লোড হবে না, কিন্তু যদি আপনি Orders অ্যাক্সেস করেন, তখন ডেটা লোড হবে।
2. Eager Loading
Eager Loading হল একটি কৌশল যেখানে সম্পর্কিত সমস্ত ডেটা ডেটাবেস থেকে একসাথে লোড হয় যখন মূল অবজেক্ট লোড করা হয়। এটি সাধারণত তখন ব্যবহৃত হয় যখন আপনি জানেন যে আপনি সম্পর্কিত ডেটা একসাথে ব্যবহার করতে যাচ্ছেন এবং একটি একক কোয়েরির মাধ্যমে সমস্ত ডেটা লোড করা প্রয়োজন।
Eager Loading কনফিগারেশন
Eager Loading কনফিগার করতে আপনাকে mapping ফাইলে lazy="false" ব্যবহার করতে হবে।
<bag name="Orders" table="Orders" lazy="false">
<key column="CustomerId"/>
<one-to-many class="Order"/>
</bag>
এখানে, lazy="false" ব্যবহার করলে Orders এর সমস্ত ডেটা একসাথে লোড হবে, যখন Customer অবজেক্ট লোড হবে।
Eager Loading উদাহরণ
ধরা যাক আপনি যদি Customer অবজেক্টের সাথে সমস্ত Orders ডেটা একসাথে লোড করতে চান, তাহলে আপনি নিচের মত কোড ব্যবহার করতে পারেন:
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var customer = session.Get<Customer>(1); // Customer Id 1 এর জন্য
var orders = customer.Orders; // Orders এখানে লোড হয়ে যাবে কারণ lazy="false"
}
এখানে, Orders সম্পর্কিত সমস্ত ডেটা একসাথে লোড হবে Customer অবজেক্ট লোড করার সময়।
3. Join Fetching
কখনও কখনও, আপনাকে Eager Loading ব্যবহার করার জন্য শুধুমাত্র সম্পর্কিত ডেটার জন্য অতিরিক্ত কোয়েরি তৈরি করতে হতে পারে। কিন্তু, আপনি যদি Join Fetching ব্যবহার করেন, তাহলে আপনি একটিতে সমস্ত সম্পর্কিত ডেটা লোড করতে পারেন।
Join Fetching কনফিগারেশন
এটা করতে, আপনাকে HQL (Hibernate Query Language) বা Criteria API ব্যবহার করতে হবে। এখানে HQL ব্যবহার করে একটি উদাহরণ দেওয়া হলো:
using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
var query = session.CreateQuery("from Customer c join fetch c.Orders where c.Id = :id");
query.SetParameter("id", 1);
var customer = query.UniqueResult<Customer>(); // Orders একসাথে লোড হবে
}
এখানে join fetch ব্যবহার করা হয়েছে, যার মাধ্যমে Customer এবং তার Orders একসাথে লোড হবে। এটি Eager Loading এর একটি উদাহরণ।
4. Lazy এবং Eager Loading এর পার্থক্য
| Lazy Loading | Eager Loading | |
|---|---|---|
| কখন ডেটা লোড হবে | সম্পর্কিত ডেটা তখনই লোড হবে যখন সেটি প্রথমবার অ্যাক্সেস করা হবে। | সম্পর্কিত ডেটা মূল অবজেক্টের সাথে একসাথে লোড হবে। |
| পারফরম্যান্স | পারফরম্যান্সে উন্নতি, কারণ অতিরিক্ত ডেটা লোড করা হয় না। | একাধিক কোয়েরি হতে পারে, তবে সম্পর্কিত ডেটা একসাথে লোড হয়। |
| ব্যবহার | যদি সম্পর্কিত ডেটা সবসময় প্রয়োজন না হয়। | যদি সম্পর্কিত ডেটা একসাথে প্রয়োজন হয়। |
5. Lazy এবং Eager Loading এর সঠিক ব্যবহার
- Lazy Loading ব্যবহার করুন যদি আপনি নিশ্চিত না হন যে, সম্পর্কিত ডেটা আসলেই কখনো ব্যবহার হবে। এটি মেমরি অপ্টিমাইজেশনে সহায়তা করবে।
- Eager Loading ব্যবহার করুন যদি সম্পর্কিত ডেটা নিশ্চিতভাবে দরকার হয় এবং আপনি একসাথে সমস্ত ডেটা লোড করতে চান।
এভাবে, NHibernate এ Lazy এবং Eager Loading কনফিগার করে, আপনি ডেটা লোডিং অপ্টিমাইজেশন করতে পারবেন এবং পারফরম্যান্স বাড়াতে পারবেন।
Read more